﻿/* Comment Remover
 * (C) Andrey Mikhaylin (Cenobith), 2008 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CommentRemover
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Comment Remover 1.0");
            Console.WriteLine("Copyright (C) Andrey Mikhaylin (Cenobith) 2008");
            Console.WriteLine();
            //Здесь будет обработка параметров
            if (args.Length == 0)
            {
                Console.WriteLine("Usage:");
                Console.WriteLine("CommentRemover <infile> <outfile> <language>");
                Console.WriteLine("  Supported languages:");
                Console.WriteLine("         c  - C/C++/C#");
                Console.WriteLine("         plsql - Oracle PL/SQL");
                Console.WriteLine("         delphi - Borland Delphi");
            }
            else
            {
                string sl="";
                string mlstart="";
                string mlstop="";

                switch (args[2])
                {
                    case "c":
                        sl = "//";
                        mlstart = "/*";
                        mlstop = "*/";
                        break;
                    case "plsql":
                        sl = "--";
                        mlstart = "/*";
                        mlstop = "*/";
                        break;
                    case "delphi":
                        sl = "//";
                        mlstart = "{";
                        mlstop = "}";
                        break;
                }

                int ss = 0; //Счетчик однострочных 
                int ms = 0; //Счетчик многострочных
                //Открываем поток на чтение
                using (StreamReader srd = new StreamReader(args[0], Encoding.Default))
                {
                    string s; //Сюда будем читать строку
                    //Открываем поток на запись
                    using (StreamWriter swr = new StreamWriter(args[1], false, Encoding.Default))
                    {
                        bool mlc = false; //Признак многострочного коммента
                        while (!srd.EndOfStream)
                        {
                            s = srd.ReadLine();
                            StringBuilder ts = new StringBuilder();
                            int t;
                            if (!mlc)
                            {
                                t = s.IndexOf(mlstart);
                                if (t != -1) //Удаляем многострочные комментарии
                                {
                                    ms++;
                                    ts.Append(s.Substring(0, t));
                                    int f = s.IndexOf(mlstop);
                                    if (f != -1) //Многосточный коммент не закрывается
                                    {
                                        if (f != s.Length - 1)
                                            ts.Append(s.Substring(f+mlstop.Length, s.Length - (f+mlstop.Length)));
                                        mlc = false;
                                    }
                                    else
                                        mlc = true;
                                }
                                else
                                {
                                    t = s.IndexOf(sl);
                                    if (t != -1) //Удаляем однострочный коммент
                                    {
                                        ts.Append(s.Substring(0, t));
                                        ss++;
                                    }
                                    else
                                        ts.Append(s);
                                }
                            }
                            else
                            {
                                t = s.IndexOf(mlstop);
                                if (t != -1)
                                {
                                    ts.Append(s.Substring(t+mlstop.Length, s.Length-(t+mlstop.Length)));
                                    mlc = false;
                                }
                            }
                            if (ts.ToString()!="")
                                swr.WriteLine(ts.ToString());
                        }
                        swr.Close();
                    }
                    srd.Close();
                }
                Console.WriteLine("Singleline comments removed: {0}", ss);
                Console.WriteLine("Multiline comments removed: {0}", ms);
                Console.WriteLine();
            }
        }
    }
}
